/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controle.gui.frames.internos.relatorios;

import controle.gui.frames.internos.superclasses.Controle;
import controle.gui.utils.ApagaElementosDaInterface;
import controle.gui.utils.ComboBoxUtils;
import controle.gui.utils.EnabledGUIElements;
import controle.utils.Datas;
import controle.utils.ReportUtils;
import gui.frames.internos.relatorios.IFRelatorioBoletins;
import java.io.InputStream;
import java.sql.Date;
import java.text.DateFormat;
import java.text.ParseException;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import modelo.Agente;
import modelo.Localidade;
import modelo.Municipio;
import persistencia.dao.AbstractDAO;
import persistencia.session.ConnectionFactory;

/**
 *
 * @author maycon
 */
public class ControleRelatorioBoletins extends Controle {

    private IFRelatorioBoletins frame = null;
    private ApagaElementosDaInterface apaga = new ApagaElementosDaInterface();

    public ControleRelatorioBoletins(IFRelatorioBoletins frame) {
        super(frame);
        this.frame = frame;
    }

    public void inicializa() {
        frame.getComboUsuarios().setModel(ComboBoxUtils.inicializaComboBoxEntidades("Selecione...",
                "Agente WHERE idAgente!=1", "nome"));

        //Inicializa os botões
        frame.getRadioTodoPeriodo().setSelected(true);
        
        guiAtiva(false);
    }

    public void limparGUI() {

            new ApagaElementosDaInterface().apagaJComboBox(frame.getComboUsuarios(), frame.getComboLocalidade());
            new ApagaElementosDaInterface().apagaJTextField(frame.getTextCodigoMunicipio(), frame.getTextNomeMunicipio(), frame.getTextCodigoLocalidade(),
                    frame.getTextCodigoAgente(), frame.getTextPeriodoFinal(), frame.getTextPeriodoInicial());

            frame.getRadioBoletimPesquisa().setSelected(true);
            frame.getRadioTodoPeriodo().setSelected(true);
            frame.getTextCodigoLocalidade().setEnabled(false);
            
            guiAtiva(false);
    }
    
    public void guiAtiva(boolean estado){
        
        if(estado){
            EnabledGUIElements.enabledJComponent(frame.getTextCodigoLocalidade(), frame.getComboLocalidade(), frame.getTextPeriodoFinal(), frame.getTextPeriodoInicial());
        } else {
            EnabledGUIElements.disabledJComponent(frame.getTextCodigoLocalidade(), frame.getComboLocalidade(), frame.getTextPeriodoFinal(), frame.getTextPeriodoInicial());
        }
    }

    /**
     * Imprime o relatório
     */
    public boolean imprimir() {

        try {

            InputStream inputStream = null;
            Municipio municipio = null;
            Localidade localidade = null;
            DateFormat dataFormatada = DateFormat.getDateInstance(DateFormat.MEDIUM, new Locale("pt", "BR"));
            Date periodoInicial = Datas.getDate(frame.getTextPeriodoInicial().getText());
            Date periodoFinal = Datas.getDate(frame.getTextPeriodoFinal().getText());
            
            //Define o tipo do boletim
            if (frame.getRadioBoletimPesquisa().isSelected()) {
                inputStream = getClass().getResourceAsStream("/Boletim_Pesquisa.jasper");
            } else {
                inputStream = getClass().getResourceAsStream("/Boletim_Tratamento.jasper");
            }

            Map parametros = new HashMap();

            //Parâmetro idBoletim
            parametros.put("idBoletimtratamento", 0);

            //Parâmetro de Município
            if (frame.getTextCodigoMunicipio().getText().isEmpty()) {
                JOptionPane.showMessageDialog(null, "Defina o município dos boletins a serem impressos.\n", "Atenção!", JOptionPane.WARNING_MESSAGE);
                return false;

            } else {
                List<Municipio> list = getListMunicipio(frame.getTextCodigoMunicipio().getText());

                if (list == null) {
                    return false;

                } else {
                    municipio = list.get(0);
                    parametros.put("idMunicipio", municipio.getIdMunicipio());

                    //Parâmetro de Localidade
                    if (!frame.getTextCodigoLocalidade().getText().isEmpty()) {
                        List<Localidade> listLoc = getListLocalidade(frame.getTextCodigoLocalidade().getText(), municipio);

                        if (listLoc != null) {
                            localidade = listLoc.get(0);
                            parametros.put("idLocalidade", localidade.getIdLocalidade());

                        } else {
                            return false;
                        }
                    }

                }
            }

            //Parâmetro de Agente
            if (!frame.getTextCodigoAgente().getText().isEmpty()) {
                List<Agente> list = getListAgente(Integer.parseInt(frame.getTextCodigoAgente().getText()), frame.getComboUsuarios().getSelectedItem().toString());
                if (list != null) {
                    parametros.put("idAgente", list.get(0).getIdAgente());

                } else {
                    return false;
                }
            }

            //Parâmetro de Períodos
            if (frame.getRadioTodoPeriodo().isSelected()) {
                parametros.put("periodo", "Todos");

            } else {

                //Verifica se as datas de período não foram preenchidas corretamente e cancela a impressão
                if(frame.getRadioDurantePeriodo().isSelected() && (periodoInicial == null && periodoFinal == null)){
                    JOptionPane.showMessageDialog(null, "Preencha o período inicial e final corretamente.",
                            "Atenção", JOptionPane.WARNING_MESSAGE);
                    return false;
                }
                
                if (!periodoFinal.before(periodoInicial)) {
                    parametros.put("periodoInicial", periodoInicial);
                    parametros.put("periodoFinal", periodoFinal);
                    parametros.put("periodo", dataFormatada.format(periodoInicial) + " a " + dataFormatada.format(periodoFinal));

                } else {
                    JOptionPane.showMessageDialog(null, "A data inicial não pode ser maior do que a data final do período definido.",
                            "Atenção", JOptionPane.WARNING_MESSAGE);
                    return false;
                }
            }


            //Executa o relatório
            ReportUtils.openReport("Relatório de Boletins", inputStream, parametros, ConnectionFactory.getConnection());

            return true;
            
        } catch (Exception er) {
            JOptionPane.showMessageDialog(null, "Erro ao criar o relatório.\n" + er, "Erro", JOptionPane.ERROR_MESSAGE);
            er.printStackTrace();
        }

        return true;
    }

    /**
     * Evento do textField de código de agentes
     */
    public boolean eventoTextCodigoAgentes(JTextField textCodigoAgente, JComboBox comboAgentes, boolean agenteInativo) {

        //Busca o agente pelo código digitado
        List<Agente> age = null;

        //Verifica se o código não foi preenchido
        if (textCodigoAgente.getText().isEmpty()) {
            return false;
        }

        if (agenteInativo) {
            age = AbstractDAO.consultar("Agente", "codigo=" + textCodigoAgente.getText().trim() + " AND codigo!=0");
            if (age != null && age.size() > 1) {
                JOptionPane.showMessageDialog(frame, "Existe mais de um agente com este código (inativo), favor selecionar também o nome do agente correto.",
                        "Atenção!", JOptionPane.WARNING_MESSAGE);
            }

        } else {
            age = AbstractDAO.consultar("Agente", "codigo=" + textCodigoAgente.getText().trim() + " AND codigo!=0  AND ativo=TRUE");

        }

        //Verifica se foi encontrado
        if (age != null && !age.isEmpty()) {
            //Seleciona o comboBox
            comboAgentes.setSelectedItem(age.get(0).getNome());

            return true;
        }

        JOptionPane.showMessageDialog(frame, "Código de agente inexistente ou inativo!", "Atenção!", JOptionPane.WARNING_MESSAGE);
        comboAgentes.setSelectedIndex(0);

        return false;
    }

    /**
     * Evento do combobox com nome dos agentes ativos
     */
    public boolean eventoComboAgentes(JComboBox comboAgentes, JTextField textCodigoAgente) {

        //Verifica se o comoboBox foi selecionado corretamente
        if (comboAgentes.getSelectedIndex() != 0) {

            //Busca o agente
            List<Agente> listAge = this.getListAgente(frame.getComboUsuarios().getSelectedItem().toString());
            if (listAge != null) {

                textCodigoAgente.setText(listAge.get(0).getCodigo().toString());

                return true;
            }

        } else {
            textCodigoAgente.setText("");
        }

        return false;
    }

    /**
     * Busca uma lista de agentes no banco de dados a partir do nome enviado por
     * parâmetro
     */
    protected List<Agente> getListAgente(String nome) {

        List<Agente> listAge = AbstractDAO.consultar("Agente", "nome='" + nome + "'");
        if (listAge.isEmpty()) {
            JOptionPane.showMessageDialog(frame, "Não existe nenhum agente com este nome.", "Agente inexistente!",
                    JOptionPane.WARNING_MESSAGE);
            return null;
        }

        return listAge;
    }

    public void eventoRadioTodoPeriodoAction() {
        frame.getRadioTodoPeriodo().setSelected(true);
        frame.getTextPeriodoInicial().setEnabled(false);
        frame.getTextPeriodoFinal().setEnabled(false);
        new ApagaElementosDaInterface().apagaJTextField(frame.getTextPeriodoFinal(), frame.getTextPeriodoInicial());
    }

    public void eventoRadioDurantePeriodo() {
        frame.getTextPeriodoInicial().setEnabled(true);
        frame.getTextPeriodoFinal().setEnabled(true);
        new ApagaElementosDaInterface().apagaJTextField(frame.getTextPeriodoFinal(), frame.getTextPeriodoInicial());
    }

    /**
     * Evento de textBuscaCodigoMunicipio
     */
    public boolean eventoTextCodigoMunicipio(JTextField textCodigoLocalidade, JComboBox comboLocalidade, JTextField textCodigoMunicipio, JTextField textNomeMunicipio) {

        String codigoMun = textCodigoMunicipio.getText().trim();

        //Verifica se o município existe
        List<Municipio> list = AbstractDAO.consultar("Municipio", "codigo='" + codigoMun + "'");
        if (list.size() > 0) {
            textNomeMunicipio.setText(list.get(0).getNome());
            EnabledGUIElements.enabledJComponent(textCodigoLocalidade, comboLocalidade);
            comboLocalidade.setModel(ComboBoxUtils.inicializaComboBoxEntidades("Selecione...", "Localidade where idMunicipio=" + list.get(0).getIdMunicipio(), "nome"));

        } else {
            new ApagaElementosDaInterface().apagaJTextField(textCodigoLocalidade, textNomeMunicipio);
            new ApagaElementosDaInterface().apagaJComboBox(comboLocalidade);
            EnabledGUIElements.disabledJComponent(textCodigoLocalidade, comboLocalidade);
            JOptionPane.showMessageDialog(null, "Não existe nenhum município com este código.", "Código de município inexistente!",
                    JOptionPane.WARNING_MESSAGE);

            //Limpa o Model do comboBox de localidade
            comboLocalidade.setModel(new DefaultComboBoxModel(new String[]{"Selecione..."}));

            return false;
        }
        return true;
    }
}
